package com.xg.util.export;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 反射工具类（性能优化版）
 * 优化点：
 * 1. 使用静态缓存存储类的字段索引映射，避免重复反射调用
 * 2. 线程安全的缓存实现（ConcurrentHashMap）
 */
public class ReflectionUtils {

    // 静态缓存：类→字段名→索引的映射（线程安全）
    private static final Map<Class<?>, Map<String, Integer>> FIELD_INDEX_CACHE = new ConcurrentHashMap<>();

    /**
     * 获取类中字段的索引位置（优化版）
     * @param clazz 类对象
     * @param fieldName 字段名
     * @return 字段索引，未找到返回-1
     */
    public static int getColumnIndexByField(Class<?> clazz, String fieldName) {
        // 先从缓存获取映射关系
        Map<String, Integer> fieldMap = FIELD_INDEX_CACHE.computeIfAbsent(clazz, k -> {
            // 首次加载类时，初始化字段映射
            Map<String, Integer> map = new HashMap<>();
            Field[] fields = clazz.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                map.put(fields[i].getName(), i);
            }
            return map;
        });

        // 从缓存中获取字段索引
        return fieldMap.getOrDefault(fieldName, -1);
    }
}